Ezra Vance
Writing

June 28, 2026 5 min read

I stopped writing scroll animations

Every section fading up as you reach it is the most common motion pattern on the web, and I have not shipped one in a year.

You know the pattern. An IntersectionObserver, a class flipped when an element crosses the fold, twenty pixels of rise and a fade. Every site I built between 2021 and 2024 had one. It is genuinely nice the first time you scroll a page.

It is less nice the fourth time, when you already know what is down there and you are waiting for the words to arrive.

The three failures

The first is that it makes the page slower for the only person who matters — the one who is coming back. A reveal is a delay you have added to content the reader has explicitly asked for by scrolling to it.

The second is that reveals fail invisibly. Content that starts at opacity: 0 and waits for JavaScript is content that stays invisible when the observer never fires: a background tab, a screenshot service, a printer, an old browser, a script blocked by a proxy. I have twice shipped a page whose social preview image was a blank rectangle, and both times it took a day to work out why.

The third is the honest one. Scroll reveals are what you reach for when a page has no motion idea of its own. They are motion applied uniformly, from the outside, to sections that have nothing in particular to say to each other. Fifteen identical entrances is not a motion system. It is a default with a stagger delay.

What replaced it

One authored moment per site, tied to something the reader actually does.

On this site, that is the block that follows your pointer down a list of work. It only exists while you are interacting; it responds to you rather than to the scroll position; and if it never loads, the list is a list. You can read the entire site with JavaScript switched off and lose nothing but a nicety.

The rule I use now

Content is visible by default, always. Motion may respond to intent — a pointer, a click, a focus — but never to mere arrival. If I cannot name what a piece of motion is telling the reader, it is decoration attached to their scrollbar, and I delete it.

The pages got faster, the code got shorter, and the one moment I kept got much more attention than it would have received as the fifteenth fade on the page. Restraint is not the absence of an idea. Usually it is the only way anyone notices you had one.

More writing